//
//  ABComposeViewController.swift
//  microblog
//
//  Created by 安波 on 15/11/4.
//  Copyright © 2015年 anbo. All rights reserved.
//

import UIKit
import FFAutoLayout
import SVProgressHUD

class ABComposeViewController: UIViewController {
    
    // MARK: - 属性
    /// toolBar底部约束
    private var toolBarBottomCon: NSLayoutConstraint?
    
    /// 微博内容的最大长度
    private let statusMaxLenght = 10
    
    // MARK: - 程序执行顺序方法
    override func viewDidLoad() {
        super.viewDidLoad()

        // 需要设置背景颜色，不然弹出时动画有问题
        view.backgroundColor = UIColor.whiteColor()
        
        // 准备UI
        prepareUI()
        // 添加键盘frame值改变的通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "willChangeFrame:", name: UIKeyboardWillChangeFrameNotification, object: nil)
        
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        // 创建一个View  将其设置为textView.inputView
//        let view = UIView(frame: CGRectMake(0, 0, 100, 120))
//        view.backgroundColor = UIColor.redColor()
//        // 自定义键盘其实就是给 textView.inputView 赋值
//        textView.inputView = view
        
        // 设置textView键盘第一响应
        textView.becomeFirstResponder()
        
    }
    
    // MARK: - 响应事件
    /// 监听键盘frame值改变的响应事件
    func willChangeFrame(notification: NSNotification) {
//        print(__FUNCTION__)
//        print("notification : \(notification)")
        
        // 获取键盘最终的位置
        let endFrame = notification.userInfo!["UIKeyboardFrameEndUserInfoKey"]!.CGRectValue
        
        // 获取键盘移动 动画时间
        let duration = notification.userInfo!["UIKeyboardAnimationDurationUserInfoKey"] as! NSTimeInterval
        
        // 获取底部约束的值
        toolBarBottomCon?.constant = -(UIScreen.height() - endFrame.origin.y)
        
        UIView.animateWithDuration(duration) { () -> Void in
            // 设置动画 直接更新View的约束，不能直接更新toolBar的约束
            self.view.layoutIfNeeded()
        }
        
    }
    
    // MARK: - 移除通知
    /// 移除通知
    deinit{
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    // MARK: - 准备UI
    /// 准备UI
    private func prepareUI() {
        // 设置导航栏
        setupNavigationBar()
        // 设置toolBar
        setupToolBar()
        // 设置TextView
        setupTextView()
    }
    
    /// 设置导航栏
    private func setupNavigationBar() {
        
        // 设置按钮  左边Item
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelButtonClick")
        
        // 设置按钮  右边Item
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "发送", style: UIBarButtonItemStyle.Plain, target: self, action: "sendButtonClick")
        // 设置navigationItem.rightBarButtonItem的权限  为没有权限
        navigationItem.rightBarButtonItem?.enabled = false
        
        // 设置title标题
        setupTitleView()
        
    }
    
    /// 设置title标题
    private func setupTitleView() {
        let prefix = "发微博"
        
        // 获取用户的名称
        if let name = ABUserAccount.loadAccount()?.name {
            
            // 有用户名
            let titleName = prefix + "\n" + name
            
            // 创建可变的属性文本
            let attrString = NSMutableAttributedString(string: titleName)
            
            // 创建label
            let label = UILabel()
            
            // 设置属性文本
            label.numberOfLines = 0
            label.textAlignment = NSTextAlignment.Center
            label.font = UIFont.systemFontOfSize(14)
            
            // 获取NARange
            let nameRange = (titleName as NSString).rangeOfString(name)
            
            // 设置属性文本的属性
            attrString.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(12), range: nameRange)
            attrString.addAttribute(NSForegroundColorAttributeName, value: UIColor.lightGrayColor(), range: nameRange)
            
            // 将属性文本的内容赋值给label  并设置适配大小
            label.attributedText = attrString
            label.sizeToFit()
            
            // 将label赋值给 导航栏上的titleView
            navigationItem.titleView = label
        }else{
            // 没有名字
            navigationItem.title = prefix
        }
        
        
    }
    
    /// 设置toolBar
    private func setupToolBar() {
        
        // 添加子控件
        view.addSubview(toolBar)
        
        // 添加约束  并获得底部约束
        let con = toolBar.ff_AlignInner(ff_AlignType.BottomLeft, referView: view, size: CGSize(width: UIScreen.width(), height: 44))
        toolBarBottomCon = toolBar.ff_Constraint(con, attribute: NSLayoutAttribute.Bottom)
        
        // 创建toolbar上的Item
        var items = [UIBarButtonItem]()
        
        // 每个item对应的图片名称
        let itemSettings = [["imageName": "compose_toolbar_picture", "action": "picture"],
                            ["imageName": "compose_trendbutton_background", "action": "trend"],
                            ["imageName": "compose_mentionbutton_background", "action": "mention"],
                            ["imageName": "compose_emoticonbutton_background", "action": "emoticon"],
                            ["imageName": "compose_addbutton_background", "action": "add"]
                           ]
        
        // 记录下标
        var index = 0
        
        // 遍历itemSettings   创建UIBarButtonItem
        for dict in itemSettings {
            // 获取图片名称
            let imageName = dict["imageName"]!
            
            // 创建Item
            let item = UIBarButtonItem(imageName: imageName)
            
            // 获取点击事件的方法名
            let action = dict["action"]!
            
            // 添加点击事件
            let button = item.customView as! UIButton
            button.tag = index
//            button.addTarget(self, action: "itemClick:", forControlEvents: UIControlEvents.TouchUpInside)
            button.addTarget(self, action: Selector(action), forControlEvents: UIControlEvents.TouchUpInside)
            
            // 添加到toolbar
            items.append(item)
            
            // 在两个Item之间添加 弹簧
            items.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil))
            
            index++
        }
        // 移除最后一个弹簧
        items.removeLast()
        
        // 将创建的Item添加到toolBar的Item上  toolBar的默认高度为44
        toolBar.items = items
        
    }
    
    /// 设置TextView
    private func setupTextView() {
        
        // 添加子控件
        view.addSubview(textView)
        view.addSubview(lenghtTipLabel)
        
        // 添加约束
        // 在控制器View的内部 左上角
        textView.ff_AlignInner(ff_AlignType.TopLeft, referView: view, size: nil)
        // 在toolBar的垂直方向 右上角
        textView.ff_AlignVertical(ff_AlignType.TopRight, referView: toolBar, size: nil)
        // 在toolBar的右上角
        lenghtTipLabel.ff_AlignVertical(ff_AlignType.TopRight, referView: toolBar, size: nil, offset: CGPoint(x: -8, y: -8))
        
    }
    
    // MARK: - 按钮事件
    func picture() {
        print("图片")
    }
    
    func trend() {
        print("#")
    }
    
    func mention() {
        print("@")
    }
    
    func emoticon() {
        print("表情")
    }
    
    func add() {
        print("加号")
    }
    
    /// 应用switch来实现
    func itemClick(button: UIButton){
        print("button: \(button.tag)")
        switch button.tag {
        case 0:
            print("图片")
        case 1:
            print("#")
        case 2:
            print("@")
        case 3:
            print("表情")
        case 4:
            print("加号")
        default:
            print("没有按钮")
        }
    }
    
    /// 取消  关闭控制器
    @objc private func cancelButtonClick() {
//        print(__FUNCTION__)
        // 取消键盘的第一响应
        textView.resignFirstResponder()
        // 关闭sv提示
        SVProgressHUD.dismiss()
        // 关闭控制器
        dismissViewControllerAnimated(true, completion: nil)
        
    }
    
    /// 发微博
    func sendButtonClick() {
//        print(__FUNCTION__)
        // 获取textView的文本内容
        let status = textView.text
        
        // 判断微博内容的长度 < 0 不发送
        let statusLenght = textView.text.characters.count
        if statusMaxLenght - statusLenght < 0 {
            // 提示：微博内容超出
            SVProgressHUD.showErrorWithStatus("微博内容长度超出!无法发送？", maskType: SVProgressHUDMaskType.Black)
            return
        }
        
        // 提示： 正在发布微博...
        SVProgressHUD.showWithStatus("正在发布微博...", maskType: SVProgressHUDMaskType.Black)
        
        // 调用网络工具类来发送微博
        ABNetworkTools.sharedInstance.sendStatus(status) { (result, error) -> () in
            if error != nil {
                // 提示警告
                SVProgressHUD.showErrorWithStatus("网络不给力...", maskType: SVProgressHUDMaskType.Black)
                return
            }
            // 发送成功  直接关闭控制器
            self.cancelButtonClick()
        }
    }
    
    // MARK: - 懒加载
    /// toolBar
    private lazy var toolBar: UIToolbar = {
        let toolBar = UIToolbar()
        
        // 设置背景色
        toolBar.backgroundColor = UIColor(white: 0.8, alpha: 1)
        
        return toolBar
    }()
    
    /// textView
    private lazy var textView: ABPlaceholderTextView = {
        let textView = ABPlaceholderTextView()
        
        // 设置相关属性
        textView.backgroundColor = UIColor.brownColor()
        textView.tintColor = UIColor.blackColor()
        textView.font = UIFont.systemFontOfSize(18)
        textView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
        textView.bounces = true
        
        // 设置占位文本
        textView.placeholder = "分享新鲜事..."
        
        // 设置顶部的偏移
        textView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0)
        
        // 设置控制器作为textView的代理来监听textView文本的改变
        textView.delegate = self
        
        return textView
    }()
    
    /// 微博字数限制的label  显示微博剩余长度
    private lazy var lenghtTipLabel: UILabel = {
        let label = UILabel(fonsize: 12, textColor: UIColor.lightGrayColor())
        
        // 设置默认长度
        label.text = String(self.statusMaxLenght)
        
        return label
    }()

}


// TODO: 扩展ABComposeViewController，实现UITextViewDelegate协议
extension ABComposeViewController: UITextViewDelegate {
    
    // 当文本改变时 调用
    func textViewDidChange(textView: UITextView) {
        
        // 当textView有文本时，发送 按钮可用
        // 当textView没有文本时，发送 按钮不可用
        navigationItem.rightBarButtonItem?.enabled = textView.hasText()
        
        // 计算剩余微博长度
        let statusLenght = textView.text.characters.count
        let lenght = statusMaxLenght - statusLenght
        lenghtTipLabel.text = String(lenght)
        
        // 判断警示提示
        lenghtTipLabel.textColor = lenght < 0 ? UIColor.redColor() : UIColor.lightGrayColor()
    }
    
}


